package com.aliyun.messagemgt.repository;

import com.aliyun.messagemgt.common.annotation.PagingAnnotation;
import com.aliyun.messagemgt.domain.repository.MessageTemplateRepository;
import com.aliyun.messagemgt.dto.MessageTemplate;
import com.aliyun.messagemgt.dto.MessageTemplateParam;
import com.aliyun.messagemgt.dto.query.MessageTemplateQuery;
import com.aliyun.messagemgt.entities.MessageTemplateEntity;
import com.aliyun.messagemgt.entities.MessageTemplateParamEntity;
import com.aliyun.messagemgt.repository.mappers.MessageTemplateMapper;
import com.aliyun.messagemgt.repository.mappers.MessageTemplateParamMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description
 * @Author hzw
 * @Date 2020/12/16 10:56
 * @Version 1.0
 */
@Service
public class MessageTemplateMybatisRepository implements MessageTemplateRepository {
    @Autowired
    private MessageTemplateMapper messageTemplateMapper;

    @Autowired
    private MessageTemplateParamMapper messageTemplateParamMapper;

    @Override
    public Integer update(MessageTemplate messageTemplate) {
        MessageTemplateEntity messageTemplateEntity = new MessageTemplateEntity();
        BeanUtils.copyProperties(messageTemplate, messageTemplateEntity);
        return messageTemplateMapper.update(messageTemplateEntity);
    }

    @Override
    public List<MessageTemplate> queryList(MessageTemplateQuery query) {
        MessageTemplateEntity messageTemplateEntity = new MessageTemplateEntity();
        BeanUtils.copyProperties(query, messageTemplateEntity);
        List<MessageTemplateEntity> list = messageTemplateMapper.queryList(messageTemplateEntity);
        List<MessageTemplate> data = new ArrayList<>();
        for (MessageTemplateEntity messageTemplateEntity1 : list) {
            MessageTemplate messageTemplate = new MessageTemplate();
            BeanUtils.copyProperties(messageTemplateEntity1, messageTemplate);
            data.add(messageTemplate);
        }
        return data;
    }

    @Override
    @PagingAnnotation
    public PageInfo<MessageTemplate> queryListSign(MessageTemplateQuery query) {
        MessageTemplateEntity param = new MessageTemplateEntity();
        BeanUtils.copyProperties(query, param);
        List<MessageTemplateEntity> list = messageTemplateMapper.queryList(param);
        List<MessageTemplate> messageTemplates = dataConvert(list);
        if (CollectionUtils.isEmpty(list)) {
            return new PageInfo<>();
        }
        PageInfo pageInfo = new PageInfo(list);
        pageInfo.setList(messageTemplates);
        return pageInfo;
    }

    @Override
    public Long listCount() {
        return messageTemplateMapper.listCount();
    }

    @Override
    public Integer queryByTemplateName(MessageTemplate templateName) {
        return messageTemplateMapper.queryByTemplateName(templateName);
    }

    @Override
    public MessageTemplate queryByEntity(MessageTemplate messageTemplate) {
        MessageTemplateEntity param = new MessageTemplateEntity();
        BeanUtils.copyProperties(messageTemplate, param);
        MessageTemplateEntity messageTemplateEntity = messageTemplateMapper.queryByEntity(param);
        if (messageTemplateEntity == null) {
            return null;
        }
        MessageTemplate data = new MessageTemplate();
        BeanUtils.copyProperties(messageTemplateEntity, data);
        return data;
    }

    @Override
    public MessageTemplate queryByEntitySign(MessageTemplate messageTemplate) {
        MessageTemplateEntity param = new MessageTemplateEntity();
        param.setId(messageTemplate.getTemplateId());
        MessageTemplateEntity messageTemplateEntity = messageTemplateMapper.queryByEntitySign(param);
        if (messageTemplateEntity == null) {
            return null;
        }
        MessageTemplate data = new MessageTemplate();
        BeanUtils.copyProperties(messageTemplateEntity, data);
        data.setTemplateId(messageTemplateEntity.getId());
        QueryWrapper<MessageTemplateParamEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("template_id",messageTemplate.getTemplateId());
        queryWrapper.eq("is_deleted","N");
        List<MessageTemplateParamEntity> messageTemplateParamEntities = messageTemplateParamMapper.selectList(queryWrapper);
        List<MessageTemplateParam> params = new ArrayList<>();
        for (MessageTemplateParamEntity messageTemplateParamEntity : messageTemplateParamEntities) {
            MessageTemplateParam messageTemplateParam = new MessageTemplateParam();
            BeanUtils.copyProperties(messageTemplateParamEntity,messageTemplateParam);
            params.add(messageTemplateParam);
        }

        data.setParamList(params);
        return data;
    }


    @Override
    public Integer saveTemplate(MessageTemplate param) {
        MessageTemplateEntity templateEntity = new MessageTemplateEntity();
        BeanUtils.copyProperties(param,templateEntity);
        Integer data = messageTemplateMapper.saveTemplate(templateEntity);
        MessageTemplateEntity messageTemplateEntity = messageTemplateMapper.queryByTemplateCode(param);
        List<MessageTemplateParam> paramList = param.getParamList();
        if (paramList == null){
            return data;
        }
        if (paramList.size() > 0) {
            for (MessageTemplateParam templateParam : paramList) {
                MessageTemplateParamEntity paramEntity = new MessageTemplateParamEntity();
                BeanUtils.copyProperties(param,paramEntity);
                paramEntity.setTemplateId(messageTemplateEntity.getId());
                paramEntity.setParamName(templateParam.getParamName());
                paramEntity.setParamDescription(templateParam.getParamDescription());
                paramEntity.setIsDeleted(templateEntity.getIsDeleted());
                messageTemplateParamMapper.insert(paramEntity);
            }
        }
        return data;
    }

    @Override
    public Integer updateTemplate(MessageTemplate param) {
        MessageTemplateEntity templateEntity = new MessageTemplateEntity();
        BeanUtils.copyProperties(param,templateEntity);
        templateEntity.setId(param.getTemplateId());
        Integer data = messageTemplateMapper.update(templateEntity);
        List<MessageTemplateParam> paramList = param.getParamList();
        if (paramList == null){
            return data;
        }
        if (paramList.size() > 0) {
            for (MessageTemplateParam templateParam : paramList) {
                MessageTemplateParamEntity paramEntity = new MessageTemplateParamEntity();
                BeanUtils.copyProperties(param, paramEntity);
                paramEntity.setParamName(templateParam.getParamName());
                paramEntity.setParamDescription(templateParam.getParamDescription());
                paramEntity.setIsDeleted(templateParam.getIsDeleted());
                QueryWrapper<MessageTemplateParamEntity> queryWrapper = new QueryWrapper<>();
                //根据id查询是否存在该值，如果存在则修改，如果不存在则添加
                MessageTemplateParamEntity messageTemplateParamEntity = messageTemplateParamMapper.selectById(templateParam.getId());
                if (messageTemplateParamEntity == null) {
                    messageTemplateParamMapper.insert(paramEntity);
                } else {
                    queryWrapper.eq("id",templateParam.getId());
                    messageTemplateParamMapper.update(paramEntity, queryWrapper);
                }
            }
        }
        return data;
    }

    @Override
    public Integer updateStatus(MessageTemplate messageTemplate) {
        MessageTemplateEntity messageTemplateEntity = new MessageTemplateEntity();
        messageTemplateEntity.setId(messageTemplate.getTemplateId());
        messageTemplateEntity.setIsEnabled(messageTemplate.getIsEnabled());
        return messageTemplateMapper.updateStatus(messageTemplateEntity);
    }

    @Override
    public Integer isDelete(MessageTemplate templateParam) {
        Integer delete = messageTemplateMapper.isDelete(templateParam);
        MessageTemplateParamEntity paramEntity = new MessageTemplateParamEntity();
        paramEntity.setTemplateId(templateParam.getTemplateId());
        paramEntity.setIsDeleted(templateParam.getIsDeleted());
        QueryWrapper<MessageTemplateParamEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("template_id",paramEntity.getTemplateId());
        messageTemplateParamMapper.update(paramEntity,queryWrapper);
        return delete;
    }

    @Override
    public Integer queryByCode(MessageTemplate templateCode) {
        return messageTemplateMapper.queryByCode(templateCode);
    }

    @Override
    public String queryByTemplateId(Long templateId) {
        return messageTemplateMapper.queryByTemplateId(templateId).getTemplateCode();
    }

    @Override
    public PageInfo<MessageTemplate> isEnabledList(MessageTemplateQuery query) {
        MessageTemplateEntity param = new MessageTemplateEntity();
        BeanUtils.copyProperties(query, param);
        List<MessageTemplateEntity> list = messageTemplateMapper.isEnabledList(param);
        List<MessageTemplate> messageTemplates = dataConvert(list);
        if (CollectionUtils.isEmpty(list)) {
            return new PageInfo<>();
        }
        PageInfo pageInfo = new PageInfo(list);
        pageInfo.setList(messageTemplates);
        return pageInfo;
    }

    @Override
    public Integer queryByTemplateTitle(MessageTemplate templateTitle) {
        return messageTemplateMapper.queryByTemplateTitle(templateTitle);
    }

    /**
     * 实体类转换
     *
     * @param list
     * @return
     */
    private List<MessageTemplate> dataConvert(List<MessageTemplateEntity> list) {
        if (list == null || list.size() <= 0) {
            return null;
        }
        List<MessageTemplate> data = new ArrayList<>();
        for (MessageTemplateEntity messageTemplateEntity1 : list) {
            MessageTemplate messageTemplate = new MessageTemplate();
            messageTemplate.setTemplateId(messageTemplateEntity1.getId());
            BeanUtils.copyProperties(messageTemplateEntity1, messageTemplate);
            data.add(messageTemplate);
        }
        return data;
    }
}
